package com.example.permissionservice.service;

import com.example.permissionservice.pojo.UserWithRole;
import com.myprojects.common.dto.Msg;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RequestBody;

import javax.validation.Valid;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class RegisterService {
    @Autowired
    UserWithRoleService userWithRoleService;

    @Autowired
    UserRoleRelationService userRoleRelationService;

    /**
     * 该方法用于使用用户信息来注册
     */
    public Msg register(@Valid @RequestBody UserWithRole user, BindingResult bindingResult) {
        Msg result = new Msg();//尝试注册后的返回结果

        //先调用检查接口检查用户信息有没有错误
        Msg checkResult = checkRegister(user, bindingResult);
        System.out.println("传入的UserWithRole为:" + user);
        //如果能注册，则注册用户并返回注册是否成功的信息
        if (checkResult.getCode() == 200) {//200为成功，400为失败
            try {
                int iRegister = userWithRoleService.insertSelective(user);
                if (iRegister > 0) {//大于0为成功
                    userRoleRelationService.initRelationByUser(user);
                    result.setMsg("注册成功！");
                    //为了安全考虑，返回的账号信息不能带有密码
                    user.setPassword(null);
                    user.setPassword2(null);
                    user.setEncrypt_password(null);
                    result.addData("user", user);//把该注册的用户返回给页面
                    result.setCode(200);
                } else {
                    result.setMsg("注册失败！");
                    result.setCode(400);
                }
            } catch (Exception e) {
                e.printStackTrace();
                result.setMsg("注册失败！");
                result.setCode(400);
            }
        } else {
            result = checkResult;
        }

        return result;
    }

    /**
     * 该方法会检查用户的所有属性是否合法，给注册用户使用
     *
     * @return 携带错误信息的map，若map.size()>0则说明验证失败
     */
    public Map<String, Object> checkRegisterUser(UserWithRole user, BindingResult result) {
        Map<String, Object> errorMap = new HashMap<>();

        //先检查数据格式是否有误
        if (result.hasErrors()) {
            List<FieldError> fieldErrors = result.getFieldErrors();
            for (FieldError error : fieldErrors) {
                errorMap.put(error.getField(), error.getDefaultMessage());
            }
        }
        //再检查该用户名是否已存在
        if (userWithRoleService.checkUsername(user.getUsername())) {
            errorMap.put("username", "该用户名已存在!");
        }
        //检查二次密码是否一致
        if (!user.getPassword2().equals(user.getPassword())) {
            errorMap.put("password2", "二次密码不一致!");
        }
        //返回errorMap
        return errorMap;
    }


    /**
     * 该方法用于检查用户注册的信息
     */
    public Msg checkRegister(@Valid @RequestBody UserWithRole user, BindingResult bindingResult) {
        Boolean bCanRegister = true;//是否允许注册的标识
        Msg result = new Msg();//尝试注册后的返回结果

        //先检查用户信息有没有错误
        Map<String, Object> errorMap = this.checkRegisterUser(user, bindingResult);
        //检查所有必须要的属性
//        if (user.getUsername() == null || "".equals(user.getUsername())){
//            errorMap.put("username","用户名不能为空！");
//        }
//        if (user.getNickname() == null || "".equals(user.getNickname())){
//            errorMap.put("nickname","昵称不能为空！");
//        }
//        if (user.getPassword() == null || "".equals(user.getPassword())){
//            errorMap.put("password","密码不能为空！");
//        }
//        if (errorMap.get("password2") != null){
//            if (!user.getPassword2().equals(user.getPassword())){
//                errorMap.put("password2","二次密码不一致!");
//            }
//        }
//        if (user.getEmail() == null || "".equals(user.getEmail())){
//            errorMap.put("email","邮箱不能为空！");
//        }

        //如果有错误，则不能注册
        if (errorMap.size() > 0) {
            bCanRegister = false;
            result.setCode(400);
            result.setMsg("用户信息格式错误!");
            result.addData("errorMap", errorMap);
        }

        //如果能注册，则是否允许注册的信息
        if (bCanRegister) {
            result.setMsg("已通过注册验证！");
            result.setCode(200);
        }

        return result;
    }


}
